Solaris, and OpenBSD. It is most useful on the 330 and SportTrak;
Meridians can just read the maps from the SD cards.
-It does **not** create or edit those maps; for that you must still use
-Mapsend. But once you've used Mapsend to create the maps, you may keep
-a collection of *.img files on your UNIX system and use this utility to
-shoot them into your receiver.
+It does **not** create or edit those maps; for that you must still
+use Mapsend. But once you've used Mapsend to create the maps, you
+may keep a collection of *.img files on your UNIX system and use this
+utility to shoot them into your receiver. The files you need are in the
+"export/images" in whatever location you installed Mapsend.
Usage is simple:
#define xmalloc malloc
-#define FRAME_SIZE 2000
+#define FRAME_SIZE 1000
int magfd;
struct termios orig_tio;
struct termios new_tio;
int debug_level = 0;
+int synced;
typedef struct {
unsigned int data_length;
dump_xframe(frame);
}
- if (debug_level > 0) {
- fprintf(stderr, "Sending packet %d ", frame_number);
- }
+ debug("Sending packet %d ", frame_number);
if (frame->data_length == 6) {
int flen;
exit (1);
case 0x81:
- if (debug_level > 0) {
- fprintf(stderr, "Retransmitting frame %d\n",
- frame_number);
- }
+ debug("Retransmitting frame %d\n", frame_number);
/*
* It's not documented, but the unit sends us two
* additional bytes in one of these. I'm guessing it's
goto retry_tx;
case 0x82:
- fprintf(stderr,
- "Unit saw rec length > 1024. We sent %d\n",
+ debug( "Unit saw rec length > 1024. We sent %d\n",
frame->data[0] << 8 | frame->data[1]);
exit(1);
default:
abort();
}
- if (debug_level > 0) {
- fprintf(stderr, "Acked.\n");
- }
+ debug("Acked.\n");
return 0;
}
for (n = 0; n < sz - FRAME_SIZE; n += FRAME_SIZE,frame_number++) {
vld = make_xframe(&buf[n], FRAME_SIZE, frame_number);
+ printf("\r%3.02f%% done", 100.0 * ((double) n / (double) sz));
xmit_xframe(vld, frame_number);
left -= FRAME_SIZE;
}
}
vld = make_xframe(&buf[0], 0, frame_number++);
+ printf("\r100.00%% done\n");
return xmit_xframe(vld, frame_number);
}
send_upload_cmd(void)
{
#define MU_CMD "$PMGNCMD,MPUPLOAD,2*72\r\n"
-fprintf(stderr, "send_up %d\n", magfd);
write(magfd, MU_CMD, sizeof(MU_CMD));
cfsetospeed(&new_tio, B115200);
cfsetispeed(&new_tio, B115200);
void
alarm_handler(int a)
{
+ if (synced) {
+ signal(SIGALRM, SIG_DFL);
+ return;
+ }
restore_port();
fprintf(stderr, "Fatal error: No communications %d.\n", magfd);
exit(1);
sync_receiver(void)
{
int i;
- int synced;
char c = 0x55;
signal(SIGALRM, alarm_handler);
inf = fopen(ifilename, "r");
file_sz = fread(ibuf, 1, sizeof(ibuf), inf);
+ if (file_sz == sizeof(ibuf)) {
+ fprintf(stderr, "File '%s' bigger than %d bytes. Exiting.\n",
+ ifilename, sizeof(ibuf));
+
+ }
cksum = xor_checksum(ibuf, file_sz);
ibuf[file_sz++] = cksum >> 8;